#ifndef MRMUSIC_H
#define MRMUSIC_H

#include <QWidget>
#include <QJsonArray>
#include <QJsonObject>
#include <QMediaPlayer>
#include <QPropertyAnimation>
#include <QSqlDatabase>
#include "volumetool.h"
#include "musiclist.h"
#include "commonpage.h"
#include "lrcpage.h"

QT_BEGIN_NAMESPACE
namespace Ui { class mrMusic; }
QT_END_NAMESPACE

class mrMusic : public QWidget
{
    Q_OBJECT

public:
    mrMusic(QWidget *parent = nullptr);
    ~mrMusic();

    void initUI();
    void initPlayer();

protected:
    void mousePressEvent(QMouseEvent* event);
    void mouseMoveEvent(QMouseEvent* event);

    void connectSignalsAndSlots();
    void onBtFormClick(int id);
    void upDateLikeMusics(bool isLike, const QString& musicId);

    QJsonArray randomPicture();

    //播放控制相关的槽函数
    void onPlayClicked();
    void onPlayerStateChanged();

    void onPlayUpClicked();
    void onPlayDownClicked();

    void onPlayModeClicked();
    void onPlayBackModeChanged();

    void onPlayAllMusic(PageType pageType);
    void playAllOfCommonPage(CommonPage* page, int index);
    void playMusicByIndex(CommonPage* page, int index);

    void onCurrentIndexChanged(int index);

    //音量控制相关的槽函数
    void setMusicSilence(bool isMuted);
    void setMusicVolume(int volumeRatio);

    //同步歌曲时长
    void onDurationChanged(qint64 duration);
    void onPositionChanged(qint64 duration);

    void onMusicSliderChanged(double rate);

    //同步歌曲名称、歌手、封面图片
    void onMetaDataAvailableChanged(bool available);

    // lrc 歌词界面
    void onLyricClicked();
    void onHideBtnClicked();

    //数据库相关
    void initSqlite();

    //托盘菜单相关函数
    void onMrMusicQuit();
    void initMusicList();

    //更新 BtForm 动画
    void updateBtFormAnimation();

private slots:
    void on_quit_clicked();
    void on_volume_clicked();
    void on_addLocal_clicked();

    void on_min_clicked();

    void on_skin_clicked();

private:
    Ui::mrMusic *ui;

    QPoint dragPosition;    //鼠标距离窗口左上角的距离

    bool isDrag;    //当按钮落在 btForm 上时，禁止拖拽

    VolumeTool* volumeTool; //音量调节界面

    MusicList musicList;    //维护需要添加的本地音乐

    QMediaPlayer* player;       //专门用来播放控制
    QMediaPlaylist* playlist;   //专门用来管理播放源，包含播放模式设置等

    CommonPage* currentPage;    //当前正在播放音乐的页面

    qint64 totalDuration;   //当前播放歌曲的总时长

    int currentIndex; //当前歌曲在列表中的索引

    LrcPage* lrcPage;   // lrc 歌词界面

    QSqlDatabase sqlite;   //数据库实现数据持久化保存

    QPropertyAnimation* lrcShowAnimation;   //展示 lrc 界面动画效果
    QPropertyAnimation* lrcHideAnimation;   //隐藏 lrc 界面动画效果
};
#endif // MRMUSIC_H
